package com.jacob.cloud.mall.cartorder.service.impl;

import com.jacob.cloud.mall.cartorder.feign.ProductFeignClient;
import com.jacob.cloud.mall.cartorder.model.dao.CartMapper;
import com.jacob.cloud.mall.cartorder.model.pojo.Cart;
import com.jacob.cloud.mall.cartorder.model.vo.CartVO;
import com.jacob.cloud.mall.cartorder.service.ICartService;
import com.jacob.cloud.mall.categoryproduct.model.pojo.Product;
import com.jacob.cloud.mall.common.common.Constant;
import com.jacob.cloud.mall.common.exception.MallException;
import com.jacob.cloud.mall.common.exception.MallExceptionEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CartServiceImpl implements ICartService {

    @Autowired
    private CartMapper cartMapper;

    @Autowired
    private ProductFeignClient productFeignClient;

    /**
     * 购物车列表
     * @param userId
     * @return
     */
    @Override
    public List<CartVO> listCart(Integer userId) {
        List<CartVO> cartVOS = cartMapper.selectList(userId);
        int totalPrice = 0;
        for (CartVO cart:cartVOS) {
            cart.setTotalPrice(cart.getProductPrice() * cart.getQuantity());
        }
        return cartVOS;
    }

    /**
     * 添加商品到购物车
     * @param productId 商品id
     * @param count 商品数量
     * @param userId 用户id
     * @return
     */
    @Override
    public List<CartVO> addCart(Integer productId, Integer count, Integer userId) {
        // 校验商品信息
        validProduct(productId, count);
        Cart cart = cartMapper.selectAllByProductIdAndUserId(productId, userId);

        if (cart == null) {
            // 这个商品还没在购物车里
            Cart newCart = new Cart();
            newCart.setProductId(productId);
            newCart.setQuantity(count);
            newCart.setSelected(Constant.CartSelected.SELECTED);
            newCart.setUserId(userId);
            cartMapper.insertSelective(newCart);
        } else {
            int num = cart.getQuantity() + count;
            cart.setQuantity(num);
            cartMapper.updateByPrimaryKeySelective(cart);
        }

        return this.listCart(userId);
    }

    /**
     * 校验商品信息
     * @param productId 商品id
     * @param count 商品数量
     */
    private void validProduct(Integer productId, Integer count) {
        Product product = productFeignClient.detailForFeign(productId);
        // 商品不存在且处于下架架状态
        if (product == null || product.getStatus().equals(Constant.ProductStatus.NOT_SELL)) {
            throw new MallException(MallExceptionEnum.CART_PRODUCT_NOT_SELL);
        }
        // 库存数量不足
        if (product.getStock() < count) {
            throw new MallException(MallExceptionEnum.CART_NOT_ENOUGH);
        }
    }

    /**
     * 更新购物车某个商品的数量
     * @param productId
     * @param userId
     * @param count
     * @return
     */
    @Override
    public List<CartVO> updateCart(Integer productId, Integer userId, Integer count) {
        // 校验商品信息
        validProduct(productId, count);
        Cart cart = cartMapper.selectAllByProductIdAndUserId(productId, userId);

        if (cart == null) {
            // 这个商品还没在购物车里，无法更新
            throw new MallException(MallExceptionEnum.UPDATE_FAIL);
        } else {
            cart.setQuantity(count);
            cart.setSelected(Constant.CartSelected.SELECTED);
            cartMapper.updateByPrimaryKeySelective(cart);
        }

        return this.listCart(userId);
    }

    /**
     * 删除购物车的某个商品
     * @param productId
     * @param userId
     * @return
     */
    @Override
    public List<CartVO> deleteCart(Integer productId, Integer userId) {
        Cart cart = cartMapper.selectAllByProductIdAndUserId(productId, userId);
        if (cart == null) {
            // 这个商品还没在购物车里，无法删除
            throw new MallException(MallExceptionEnum.UPDATE_FAIL);
        } else {
            cartMapper.deleteByPrimaryKey(cart.getId());
        }
        return null;
    }

    /**
     * 选中/不选中购物车的某个商品
     * @param productId
     * @param userId
     * @param selected
     * @return
     */
    @Override
    public List<CartVO> selectOrNot(Integer productId, Integer userId, Integer selected) {
        Cart cart = cartMapper.selectAllByProductIdAndUserId(productId, userId);

        if (cart == null) {
            // 这个商品之前不在购物车里，无法删除
            throw new MallException(MallExceptionEnum.UPDATE_FAIL);
        } else {
            cartMapper.selectOrNot(userId, productId, selected);
        }

        return this.listCart(userId);
    }

    /**
     * 全选/全不选购物车的某个商品
     * @param userId
     * @param selected
     * @return
     */
    @Override
    public List<CartVO> selectedAllOrNot(Integer userId, Integer selected) {
        // 改变选中状态
        cartMapper.selectOrNot(userId, null, selected);
        return this.listCart(userId);
    }
}
